﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Ferreteria.Clases;

namespace Ferreteria.Forms.GestionClientes
{
    public partial class frmRegistrarPago : Form
    {
        DisancoEntities context;
        Clientes clienteEnt;
        Pagos pagonuevo;

        public frmRegistrarPago(int ClienteID)
        {
            InitializeComponent();

            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            clienteEnt = context.Clientes.FirstOrDefault(c => c.cliente_id == ClienteID);

            var cuentasImpagas = from cuenta in clienteEnt.Cuentas
                                 where cuenta.cuenta_pagado < cuenta.cuenta_monto
                                 select cuenta;

            dgvFacturasImpagas.Rows.Clear();
            decimal montoTotalAdeudado = 0;

            foreach (var cuenta in cuentasImpagas)
            {
                if ((cuenta.Ventas.Count > 0 && cuenta.Ventas.ElementAt(0).venta_estado != Estado.Anulada) || (cuenta.VentasAdicionales.Count > 0 && cuenta.VentasAdicionales.ElementAt(0).va_estado != Estado.Anulada))
                {
                    int i = dgvFacturasImpagas.Rows.Add();

                    string tipoFactura = "";
                    Int64 nroFactura = 0;

                    if (cuenta.Ventas.Count() > 0)
                    {
                        tipoFactura = cuenta.Ventas.First().venta_tipo_comprobante;
                        nroFactura = cuenta.Ventas.First().venta_nro_inicio;
                    }
                    else
                        if (cuenta.VentasAdicionales.Count > 0)
                        {
                            tipoFactura = "X";
                            nroFactura = cuenta.VentasAdicionales.First().va_nro_comp_ini;
                        }

                    dgvFacturasImpagas.Rows[i].Cells["cuentaid"].Value = cuenta.cuenta_id;
                    dgvFacturasImpagas.Rows[i].Cells["cuentafecha"].Value = cuenta.cuenta_fecha;
                    dgvFacturasImpagas.Rows[i].Cells["tipo"].Value = tipoFactura;
                    dgvFacturasImpagas.Rows[i].Cells["numero"].Value = nroFactura;
                    dgvFacturasImpagas.Rows[i].Cells["cuentafecha"].Value = cuenta.cuenta_fecha;
                    dgvFacturasImpagas.Rows[i].Cells["cuentahora"].Value = cuenta.cuenta_fecha;
                    dgvFacturasImpagas.Rows[i].Cells["cuentamonto"].Value = cuenta.cuenta_monto;
                    dgvFacturasImpagas.Rows[i].Cells["cuentapagado"].Value = cuenta.cuenta_pagado;
                    dgvFacturasImpagas.Rows[i].Cells["cuentaadeudado"].Value = cuenta.cuenta_monto - cuenta.cuenta_pagado;

                    montoTotalAdeudado += (cuenta.cuenta_monto - cuenta.cuenta_pagado);
                }
            }

            txbNombre.Text = clienteEnt.cliente_nombre;
            txbCuit.Text = clienteEnt.cliente_cuit;
            txbRazonSocial.Text = clienteEnt.CondicionIVA.condicion_sigla;
            txbMontoAdeudado.Text = montoTotalAdeudado.ToString("$ 0.00");

            numMonto.Maximum = montoTotalAdeudado;
            dtpChequeVencimiento.MinDate = DateTime.Now;

            cmbFormaPago.Items.Add(FormasDePago.ContadoEfectivo);
            cmbFormaPago.Items.Add(FormasDePago.Cheque);
            cmbFormaPago.SelectedIndex = 0;
        }

        private void cmbFormaPago_SelectedIndexChanged(object sender, EventArgs e)
        {
            string tipoPago = (string)cmbFormaPago.SelectedItem;

            switch (tipoPago)
            {
                case FormasDePago.Cheque:
                    lblChequeBanco.Enabled = true;
                    lblChequeNro.Enabled = true;
                    lblChequeVencimiento.Enabled = true;

                    txbChequeBanco.Enabled = true;
                    txbChequeNro.Enabled = true;

                    dtpChequeVencimiento.Enabled = true;

                    gbInfoCheque.Enabled = true;
                    break;
                default:
                    lblChequeBanco.Enabled = false;
                    lblChequeNro.Enabled = false;
                    lblChequeVencimiento.Enabled = false;

                    txbChequeBanco.Enabled = false;
                    txbChequeNro.Enabled = false;

                    dtpChequeVencimiento.Enabled = false;
                    gbInfoCheque.Enabled = false;
                    break;
            }
        }

        private void numMonto_ValueChanged(object sender, EventArgs e)
        {
            decimal montoTotalRestante = numMonto.Value;

            foreach (DataGridViewRow fila in dgvFacturasImpagas.Rows)
            {
                decimal monto = (decimal)fila.Cells["cuentamonto"].Value;
                decimal pagado = (decimal)fila.Cells["cuentapagado"].Value;
                decimal deuda = monto - pagado;

                if (deuda > 0 && montoTotalRestante > 0)
                {
                    decimal pagar = Math.Min(deuda, montoTotalRestante);

                    fila.Cells["cuentapagar"].Value = pagar;

                    montoTotalRestante -= pagar;
                    fila.DefaultCellStyle.BackColor = Color.Green;
                    fila.DefaultCellStyle.SelectionBackColor = Color.Green;
                }
                else
                {
                    fila.DefaultCellStyle.BackColor = SystemColors.Window;
                    fila.DefaultCellStyle.SelectionBackColor = SystemColors.Window;
                    fila.Cells["cuentapagar"].Value = 0;
                }
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            decimal montoTotalRestante = numMonto.Value;

            int pagoNro = obtenerPagoNumero();
            DateTime fechaActual = DateTime.Now;
            string tipoPago = (string)cmbFormaPago.SelectedItem;

            foreach (var cuenta in clienteEnt.Cuentas)
            {
                if (cuenta.cuenta_estado != Estado.Anulada)
                {
                    decimal deuda = cuenta.cuenta_monto - cuenta.cuenta_pagado;

                    if (deuda > 0 && montoTotalRestante > 0)
                    {
                        decimal pagar = Math.Min(deuda, montoTotalRestante);
                        cuenta.cuenta_pagado += pagar;

                        Pagos nuevoPago = new Pagos();
                        nuevoPago.pago_fecha = fechaActual;
                        nuevoPago.pago_tipo = tipoPago;
                        nuevoPago.pago_nro = pagoNro;
                        nuevoPago.pago_monto = pagar;

                        if (nuevoPago.pago_tipo == FormasDePago.Cheque)
                        {
                            nuevoPago.pago_cheque_vencimiento = dtpChequeVencimiento.Value;
                            nuevoPago.pago_cheque_banco = txbChequeBanco.Text;
                            nuevoPago.pago_cheque_nro = txbChequeNro.Text;
                        }

                        nuevoPago.Cuentas.Add(cuenta);
                        clienteEnt.Pagos.Add(nuevoPago);
                        montoTotalRestante -= pagar;
                        pagonuevo = new Pagos();
                        pagonuevo = nuevoPago;
                    }
                }
            }

            context.SaveChanges();
            MessageBox.Show("Pago registrado con exito", "Operación Exitosa!!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            //ImprimirComprobante();
            this.Close();
        }

        private Font printFont = new Font("Calibri", 12);
        private Font FontTit = new Font("Calibri", 11);
        private Font miniprintFont = new Font("Calibri", 8);

        private void ImprimirComprobante()
        {
            printDialogRegPago.PrinterSettings.Copies = 2;


            DialogResult resultunico = printDialogRegPago.ShowDialog();

            if (resultunico == DialogResult.OK)
            {
                printDocumentRegPago.PrinterSettings = printDialogRegPago.PrinterSettings;
                printPreviewDialogRegPago.Document = printDocumentRegPago;
                ((Form)printPreviewDialogRegPago).WindowState = FormWindowState.Maximized;
                printPreviewDialogRegPago.ShowDialog();
            }
        }

        private void txbChequeNro_KeyPress(object sender, KeyPressEventArgs e)
        {
            Validar.ValidarNumeros(e);
        }

        int obtenerPagoNumero()
        {
            if (context.Pagos.Count() > 0)
                return context.Pagos.Max(p => p.pago_nro) + 1;
            else
                return 1;
        }

        private void printDocumentRegPago_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            int margenX = 25;
            int margenY = 50;
            int anchoHoja = 800;

            PointF punto = new PointF();
            punto.X = anchoHoja / 2;
            punto.Y = margenY + 30;

            StringFormat formato = new StringFormat();
            formato.Alignment = StringAlignment.Center;

            e.Graphics.DrawString("Comprobante de Pago", printFont, Brushes.Black, 310, 20);

            string fecha = DateTime.Now.Date.ToString("dd/MM/yyyy");
            e.Graphics.DrawString("Fecha:", FontTit, Brushes.Black, 525, 60, formato);
            e.Graphics.DrawString(fecha, FontTit, Brushes.Black, 550, 60);

            e.Graphics.DrawString("Cliente:", FontTit, Brushes.Black, 125, 60, formato);
            e.Graphics.DrawString(clienteEnt.cliente_nombre, FontTit, Brushes.Black, 165, 60);

            e.Graphics.DrawString("Forma Pago:", FontTit, Brushes.Black, 100, 85, formato);
            string formpago = (string)cmbFormaPago.SelectedItem;
            e.Graphics.DrawString(formpago, FontTit, Brushes.Black, 150, 85);

            e.Graphics.DrawString("Monto de Pago:", FontTit, Brushes.Black, 450, 85, formato);
            e.Graphics.DrawString(numMonto.Value.ToString("$ 0.00"), FontTit, Brushes.Black, 520, 85);

            e.Graphics.DrawLine(Pens.Black, 50, 135, 750, 135);

            if (formpago == FormasDePago.Cheque)
            {
                if (txbChequeBanco.Text != "")
                    e.Graphics.DrawString("Banco:", FontTit, Brushes.Black, 100, 100, formato);
                e.Graphics.DrawString(txbChequeBanco.Text, FontTit, Brushes.Black, 175, 100, formato);
                if (txbChequeNro.Text != "")
                    e.Graphics.DrawString("Nro. Cheque:", FontTit, Brushes.Black, 350, 100, formato);
                e.Graphics.DrawString(txbChequeNro.Text, FontTit, Brushes.Black, 425, 100, formato);
                e.Graphics.DrawString("Vencimiento Cheque:", FontTit, Brushes.Black, 550, 100, formato);
                e.Graphics.DrawString(dtpChequeVencimiento.Value.ToShortDateString(), FontTit, Brushes.Black, 695, 100, formato);
            }

            e.Graphics.DrawLine(Pens.Black, 50, 350, 750, 350);
            e.Graphics.DrawString("Monto Total Adeudado:", FontTit, Brushes.Black, 500, 395, formato);
            //string montoadeudado = txbMontoAdeudado.Text.ToString();
            //e.Graphics.DrawString(montoadeudado.ToString(), FontTit, Brushes.Black, 590, 395);

            int xencabezado = 155;

            String fechac = "Fecha";
            e.Graphics.DrawString(fechac, miniprintFont, Brushes.Black, 75, xencabezado);
            String tipocomp = "Tipo Comp.";
            e.Graphics.DrawString(tipocomp, miniprintFont, Brushes.Black, 150, xencabezado);
            String nrocomp = "Nro. Comprobante";
            e.Graphics.DrawString(nrocomp, miniprintFont, Brushes.Black, 225, xencabezado);
            String monto = "Monto";
            e.Graphics.DrawString(monto, miniprintFont, Brushes.Black, 335, xencabezado);
            //String pagado = "Pagado Antes";
            //e.Graphics.DrawString(pagado, miniprintFont, Brushes.Black, 645, x);
            String adeudado = "Deuda";
            e.Graphics.DrawString(adeudado, miniprintFont, Brushes.Black, 475, xencabezado);
            String pago = "Pago ";
            e.Graphics.DrawString(pago, miniprintFont, Brushes.Black, 575, xencabezado);


            int posY = xencabezado + 20;
            int anchoLinea = 18;
            int posfecha = margenX + 80;
            int postipocomp = posfecha + 72;
            int posnrocomp = postipocomp + 60;
            int posmonto = posnrocomp + 100;
            int posdeuda = posmonto + 100;

            var listaPagos = context.Pagos.Where(p => p.pago_nro == pagonuevo.pago_nro);

            if (listaPagos.Count() > 0)
            {
                Pagos primerPago = listaPagos.First();

                foreach (var estepago in listaPagos)
                {
                    Cuentas cuenta = estepago.Cuentas.ElementAt(0);

                    if (cuenta.Ventas.Count != 0)
                    {
                        Ventas venta = cuenta.Ventas.First();

                        e.Graphics.DrawString(venta.venta_fecha.ToShortDateString(), miniprintFont, Brushes.Black, posfecha, posY);
                        e.Graphics.DrawString(venta.venta_tipo_comprobante, miniprintFont, Brushes.Black, postipocomp, posY);
                        e.Graphics.DrawString(venta.venta_nro_inicio.ToString("0000-00000000"), miniprintFont, Brushes.Black, posnrocomp, posY);
                        decimal montod = Math.Round(Convert.ToDecimal(venta.venta_monto),2);
                        e.Graphics.DrawString(montod.ToString(), miniprintFont, Brushes.Black, posmonto, posY);
                        decimal deuda = Math.Round(Convert.ToDecimal(venta.venta_monto - venta.Cuentas.cuenta_pagado),2);
                        e.Graphics.DrawString(deuda.ToString(), miniprintFont, Brushes.Black, posdeuda, posY);
                     }
                    else
                    {
                        if (cuenta.VentasAdicionales.Count != 0)
                        {
                            VentasAdicionales ventaAd = cuenta.VentasAdicionales.First();
                            e.Graphics.DrawString(ventaAd.va_fecha.ToShortDateString(), miniprintFont, Brushes.Black, posfecha, posY);
                            e.Graphics.DrawString("X", miniprintFont, Brushes.Black, postipocomp, posY);
                            e.Graphics.DrawString(ventaAd.va_nro_comp_ini.ToString("0000-00000000"), miniprintFont, Brushes.Black, posnrocomp, posY);
                            decimal montode = Math.Round(Convert.ToDecimal(ventaAd.va_monto), 2);
                            e.Graphics.DrawString(montode.ToString(), miniprintFont, Brushes.Black, posmonto, posY);
                            decimal deuda = Math.Round(Convert.ToDecimal(ventaAd.va_monto - ventaAd.Cuentas.cuenta_pagado),2);
                            e.Graphics.DrawString(deuda.ToString(), miniprintFont, Brushes.Black, posdeuda, posY);
                        }
                    }

                    posY += anchoLinea;

                }
            }
        }
    }
    }
